#!/usr/bin/env python3

# flake8: noqa
'''
build generated bindings from bindings.desc for AP_Scripting
'''

from waflib.TaskGen import after_method, before_method, feature
import os

def configure(cfg):
    """
    setup environment for mavlink header generator
    """
    cfg.find_program('soapcpp2')
    env = cfg.env
    env.SOAP_DIR = cfg.srcnode.make_node('libraries/AP_ONVIF/soap').abspath()
    env.SOAP_IMPORT = cfg.srcnode.make_node('modules/gsoap/gsoap/import').abspath()
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'] = []

    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'] += ['onvifDeviceBindingProxy.cpp',
                                                 'onvifMediaBindingProxy.cpp',
                                                 'onvifPTZBindingProxy.cpp']
    name = 'onvif'
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'] += ['{}C.cpp'.format(name)]
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/stdsoap2.cpp').abspath())
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/dom.cpp').abspath())
    # cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/plugin/smdevp.c').abspath())
    # cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/plugin/mecevp.c').abspath())
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/plugin/wsseapi-lite.cpp').abspath())
    cfg.env.AP_LIB_EXTRA_SOURCES['AP_ONVIF'].append(cfg.srcnode.make_node('modules/gsoap/gsoap/custom/struct_timeval.cpp').abspath())
    cfg.env.INCLUDES += [cfg.srcnode.make_node('modules/gsoap/gsoap/').abspath()]
    cfg.env.DEFINES += [
        'SOAP_H_FILE=AP_ONVIF/onvifH.h',
    ]
    env.append_value('GIT_SUBMODULES', 'gsoap')


def relpath(bld, node):
    '''make a build relative path. This is needed for CI to pass on azure'''
    blddir = bld.bldnode.make_node(".").abspath()
    return os.path.relpath(node.abspath(), blddir)


def build(bld):
    output_dir = bld.bldnode.make_node('libraries/AP_ONVIF').abspath()
    gsoap_dir = bld.srcnode.make_node('modules/gsoap/gsoap').abspath()
    import_dir = bld.srcnode.make_node('modules/gsoap/gsoap/import').abspath()
    src = bld.srcnode.ant_glob('libraries/AP_ONVIF/soap/onvif.h')
    name = 'onvif'
    generated_cpp = [bld.bldnode.find_or_declare('libraries/AP_ONVIF/{}C.cpp'.format(name))]
    generated_h = [bld.bldnode.find_or_declare('libraries/AP_ONVIF/{}H.h'.format(name))]
    bld(
        source=src,
        rule="$(cd %s;%s -2 -Cp onvif -I%s:%s -j -x ../../${SRC})" % (output_dir,
                                                                      bld.env.get_flat('SOAPCPP2'),
                                                                      import_dir, gsoap_dir),
        target=generated_cpp + generated_h,
        group='dynamic_sources'
    )
